package cn.com.cifi.mars.mapper.mars;

import cn.com.cifi.mars.bean.bo.SignProductCodeBO;
import cn.com.cifi.mars.bean.dto.MonthAvgSaleRateDeviationDto;
import cn.com.cifi.mars.bean.dto.OrgDTO;
import cn.com.cifi.mars.bean.dto.SignPlanDetailDto;
import cn.com.cifi.mars.entity.SignPlanVersionDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 签约计划版本明细表 Mapper 接口
 * </p>
 *
 * @author yyd
 * @since 2019-11-08
 */
public interface SignPlanVersionDetailMapper extends BaseMapper<SignPlanVersionDetail> {

    /**
	 * 批量签约计划详情
     * @param productList 签约计划详情列表
     */
    void insertList(@Param("list") List<SignPlanVersionDetail> productList);

    /**
     * 根据签约计划版本id查询详细信息
     * @param versionId
     * @param isDel
     * @return
     */
    List<SignPlanVersionDetail>selectByVersionId(@Param("versionId") String versionId, @Param("isDel") int isDel);

    /**
     * 查询当前时间下的签约计划版本详细信息
     * @param signProductCodeBO 产品构成属性类别
     * @return
     */
    SignPlanVersionDetail selectBySignPlanTime(SignProductCodeBO signProductCodeBO);

    /**
     * 查询组团下产品构成的签约计划详情列表
     * @param signProductCodeBO
     * @return
     */
    List<SignPlanDetailDto> selectSignPlanDetail(SignProductCodeBO signProductCodeBO);

    /**
     * 批量修改签约计划详情列表
     * @param signPlanDetailDtoList 签约计划详情列表
     */
    void saveList(@Param("list") List<SignPlanDetailDto> signPlanDetailDtoList);

    /**
     * 查询签约计划详情列表
     * @param signProductCodeBO
     * @return
     */
    List<SignPlanVersionDetail> selectSignDetail(SignProductCodeBO signProductCodeBO);

    /**
     * 查询该产品构成是否已编制状态
     * @param signProductCodeBO
     * @return
     */
   int  selectIsEstablishment(SignProductCodeBO signProductCodeBO);

   /**
	* 获取整年的签约计划金额
    * @param versionIds
    * @param year
    * @param isDel
    * @return
    */
   BigDecimal selectYearSigningTargetAmount(@Param("versionIds") List<String> versionIds,@Param("year") String year,
										@Param("isDel") int isDel);
   
   /**
          * 查询当月到12月的签约计划金额 
    * @param versionIds
    * @param isDel
    * @param beginTime
    * @param endTime
    * @return
    */
   String selectLocalMonthAndAfterSignPlanAmount(@Param("versionIds") List<String> versionIds,
		   @Param("beginTime") String beginTime,@Param("endTime") String endTime,@Param("isDel") int isDel);

    /**
     * 修改产品构成删除状态
     * @param signProductCodeBO
     */
    void updateProduct(SignProductCodeBO signProductCodeBO);
    
    /**
     * 查询签约计划时间条数 
     * @param versionIds
     * @param isDel
     * @param beginTime
     * @param endTime
     * @param productCode
     * @return
     */
    List<MonthAvgSaleRateDeviationDto> selectTimeAmount(@Param("versionIds") List<String> versionIds,@Param("isDel") int isDel,
    		@Param("beginTime") String beginTime,@Param("endTime") String endTime
    		,@Param("productCode")String productCode,
    		@Param("businessTypeName")String businessTypeName,
    		@Param("freeTypeName")String freeTypeName,
    		@Param("proTypeName")String proTypeName
    		);


    /**
     * 查询是否编辑完成的数量
     * @param versionIds
     * @param isDel
     * @param isEstablishment
     * @return
     */
    int selectEstablishmentNum(@Param("versionIds") List<String> versionIds,
    		@Param("isDel") int isDel,@Param("isEstablishment")int isEstablishment);

    
    /**
     * 获取年初存货金额
     * @param versionIds
     * @param isDel
     * @param time
     * @return
     */
    BigDecimal selectEarlyInventoryAmount(@Param("versionIds") List<String> versionIds,
    		@Param("isDel") int isDel,@Param("time")String time);
    
    /**
     * 全盘签约计划实际金额  大于等于1月,小于当前月
     * @param versionIds
     * @param isDel
     * @param beginTime
     * @param endTime
     * @return
     */
    String selectSignPlanActualAmount(@Param("versionIds") List<String> versionIds,
    		@Param("isDel") int isDel,@Param("beginTime") String beginTime,@Param("endTime") String endTime);


    /**
     * 产品构成下的实际签约金额 大于等于1月 小于当前月 计算月份数量
     * @param versionIds
     * @param isDel
     * @param beginTime
     * @param endTime
     * @param productCode
     * @return
     */
    List<MonthAvgSaleRateDeviationDto> selectSignPlanActualInfo(@Param("versionIds") List<String> versionIds,@Param("isDel") int isDel,
    		@Param("beginTime") String beginTime,@Param("endTime") String endTime
    		,@Param("productCode")String productCode,
    		@Param("businessTypeName")String businessTypeName,
    		@Param("freeTypeName")String freeTypeName,
    		@Param("proTypeName")String proTypeName);
    
    /**
     * 查询产品构成一年的实际签约计划金额信息和数量
     * @param versionIds
     * @param isDel
     * @param year
     * @param productCode
     * @return
     */
    List<MonthAvgSaleRateDeviationDto>selectYearActualSignPlanInfo(@Param("versionIds") List<String> versionIds,@Param("isDel") int isDel,
    		@Param("year") String year,@Param("productCode")String productCode,
    		@Param("businessTypeName")String businessTypeName,
    		@Param("freeTypeName")String freeTypeName,
    		@Param("proTypeName")String proTypeName);


    /**
     * 修改该产品构成编制状态
     * @param signProductCodeBO
     */
    void updateIsEstablishment(SignProductCodeBO signProductCodeBO);


	/**
	*   查询版本中最晚签约时间
     * @param versionIds 签约版本id列表
     * @param isDel 是否删除
     * @return
     */
    LocalDateTime selectEarliestDate(@Param("versionIds") List<String> versionIds,@Param("isDel") int isDel);

    /**
     * 查询该版本产品构成最晚签约时间
     * @param signProductCodeBO
     * @return
     */
    LocalDateTime selectLatestSignDateByProduct(SignProductCodeBO signProductCodeBO);

    /**
     * 查询版本组团下产品构成Code列表
     * @param versionId 版本id
     * @param isDel 是否删除
     * @return
     */
    List<SignPlanVersionDetail> selectCodeByGroup(@Param("versionId") String versionId,@Param("isDel")int isDel);
    
    
    /**
     * 查询产品构成一年的签约计划金额信息和数量
     * @param versionIds
     * @param isDel
     * @param year
     * @param productCode
     * @return
     */
    List<MonthAvgSaleRateDeviationDto>selectYearSignPlanInfo(@Param("versionIds") List<String> versionIds,@Param("isDel") int isDel,
    		@Param("year") String year,@Param("productCode")String productCode,
    		@Param("businessTypeName")String businessTypeName,
    		@Param("freeTypeName")String freeTypeName,
    		@Param("proTypeName")String proTypeName);

	/**
	 * 查询版本下指定时间段的签约实际金额(beginTime<= ? < endTime)
	 * @param versionId 版本id
	 * @param beginTime 开始时间
	 * @param endTime 结束时间
	 * @param isDel 是否删除
	 * @return
	 */
	BigDecimal selectSignActualPriceByTimeHorizon(@Param("versionId")String versionId,@Param("beginTime")String beginTime,
												  @Param("endTime")String endTime, @Param("isDel")int isDel);

	/**
	 * 查询版本下指定时间段的签约计划金额(beginTime<= ? <= endTime)
	 * @param versionId 版本id
	 * @param beginTime 开始时间
	 * @param endTime 结束时间
	 * @param isDel 是否删除
	 * @return
	 */
	BigDecimal selectSignPlanPriceByTimeHorizon(@Param("versionId")String versionId,@Param("beginTime")String beginTime,
												@Param("endTime")String endTime, @Param("isDel")int isDel);

	/**
	 * 查询版本下产品构成Code列表
	 * @param versionIds 版本id集合
	 * @param isDel 是否删除
	 * @return
	 */
	List<SignPlanVersionDetail> selectCodeById(@Param("versionIds") List<String> versionIds,@Param("isDel")int isDel);

	/**
	 * 查询业态签约详情数据
	 * @param signProductCodeBO 业态数据
	 */
	List<SignPlanVersionDetail> selectByCode(SignProductCodeBO signProductCodeBO);


	/**
	 * 根据签约计划版本id列表查询详细信息
	 * @param versionIds 版本id集合
	 * @param isDel 是否删除
	 * @return
	 */
	List<SignPlanVersionDetail> selectByVersionIds(@Param("versionIds")List<String> versionIds,@Param("isDel")int isDel);

	OrgDTO selectProjectOrg(@Param("projectId") String projectId);

    List<String> selectProProductCodeList(@Param("versionId")String versionId,@Param("isDel")int isDel);

	void copyVesionDetail(@Param("sourceVersionId")String versionId, @Param("targetVersionId")String signPlanVersionId);
}
